這篇 T-SQL 多筆金額統計 顯示方法
http://ithelp.ithome.com.tw/question/10180955?tag=hp.all
匿名發問的, 鑒於以往匿名發問者時常刪除,
造成後續參考的困擾.
所以還是用分享的方式.
On Oracle
CREATE TABLE ithelp160202a(
firm CHAR(1) NOT NULL,
part CHAR(3) NOT NULL,
price INTEGER NOT NULL
);
INSERT ALL
INTO ithelp160202a VALUES('A', '123', 100)
INTO ithelp160202a VALUES('A', '456', 200)
INTO ithelp160202a VALUES('B', '789', 300)
SELECT 1
FROM DUAL;
COMMIT;
SELECT firm
, a.part
, a.Price
, CASE
WHEN a.RowN = 1 THEN b.TotPri
ELSE NULL
END TotPri
FROM (SELECT firm
, part
, SUM(price) OVER(PARTITION BY firm, part, price) Price
, ROW_NUMBER() OVER(PARTITION BY firm ORDER BY part) RowN
FROM ithelp160202a
GROUP BY firm, part, price) a
JOIN (SELECT firm
, SUM(price) TotPri
FROM ithelp160202a
GROUP BY firm
) b
USING (firm)
ORDER BY firm, part;
FIRM PART PRICE TOTPRI
---- ---- ---------- ----------
A 123 100 300
A 456 200 {NULL}
B 789 300 300
共襄盛舉
提供另一種在 ERP 財務報表上實作案例::
<pre class="c" name="code">
SELECT a1.M_Product_ID,
a1.QTYORDERED,
a1.C_OrderLine_ID,
CASE WHEN a1.C_OrderLine_ID=a1.min_C_OrderLine_ID THEN a1.sum_QtyOrdered
ELSE NULL
END AS sum_QtyOrdered
FROM (
SELECT a.M_Product_ID,
a.QTYORDERED,
a.C_OrderLine_ID,
(SELECT MIN(b.C_OrderLine_ID) FROM C_OrderLine b WHERE b.M_Product_ID=a.M_Product_ID) AS min_C_OrderLine_ID,
(SELECT SUM(b.QtyOrdered) FROM C_OrderLine b WHERE b.M_Product_ID=a.M_Product_ID) AS sum_QtyOrdered
FROM C_OrderLine a
ORDER BY a.M_Product_ID,a.C_OrderLine_ID
) a1
小雨大的案例
很適合
不知道哪一筆會是排序出現後的第一筆
(但是小雨大例子的資料無法展現)
ROW_NUMBER() OVER(PARTITION BY firm ORDER BY part) RowN
如果不是 GROUP BY firm, part, price
可能會有兩筆以上相同 firm, part, price
所以需要 RowN 來自動給予序號
來判斷哪一個會是第一筆出現
SQL Command很有趣的.albertachen 大大的也很有意思.
以後大家還是改用分享的,以免刪掉就都消失了.
本來就想貼上去
但是這是腸鏡仁
不曉得是否會被砍掉
因此先放冰箱兩天觀察!!
改自己發就好了,腸鏡仁的以後也不好找.
hitomitanaka提到:
腸鏡仁
這個跟蝦仁有關係嗎?
跟蝦仁無關
這個妹子小腹有點突出喔...
wiselou提到:
蝦仁
吃太多了
chingfeng提到:
吃太多了
所以
來跟著跟著老師 動吃動
https://www.youtube.com/watch?v=IZkYdqRWKaY
hitomitanaka提到:
跟蝦仁無關
難到
跟那個跟我差不多帥的李大仁有關
難道跟人類的祖先有關?
人類的祖先->花....因為,花生仁
吾命由我,不由天
哇 ! 被鎖圖